package com.example.springcloud.order.exception;

import com.example.springcloud.order.result.Result;
import feign.FeignException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 全局异常处理器
 */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 处理 Feign 调用异常
     */
    @ExceptionHandler(FeignException.class)
    public Result<?> handleFeignException(FeignException e) {
        log.error("Feign 调用异常", e);

        // 提取 Feign 异常中的具体错误信息
        String errorMessage = extractFeignErrorMessage(e);

        return Result.error("订单创建失败: " + errorMessage);
    }

    /**
     * 处理运行时异常
     */
    @ExceptionHandler(RuntimeException.class)
    public Result<?> handleRuntimeException(RuntimeException e) {
        log.error("运行时异常", e);
        return Result.error(e.getMessage());
    }

    /**
     * 提取 Feign 异常中的具体错误信息
     */
    private String extractFeignErrorMessage(FeignException e) {
        String content = e.contentUTF8();

        if (content != null && !content.isEmpty()) {
            try {
                log.info("Feign 异常内容: {}", content);

                // 尝试从 JSON 响应中提取 error 字段
                if (content.contains("\"error\"")) {
                    int errorIndex = content.indexOf("\"error\"");
                    if (errorIndex >= 0) {
                        int valueStart = content.indexOf(":", errorIndex) + 1;
                        while (valueStart < content.length() && Character.isWhitespace(content.charAt(valueStart))) {
                            valueStart++;
                        }

                        if (valueStart < content.length() && content.charAt(valueStart) == '"') {
                            valueStart++;
                            int valueEnd = content.indexOf("\"", valueStart);
                            if (valueEnd > valueStart) {
                                String message = content.substring(valueStart, valueEnd);
                                if (!message.isEmpty()) {
                                    log.info("提取到错误信息: {}", message);
                                    return message;
                                }
                            }
                        }
                    }
                }

                // 尝试从 JSON 响应中提取 message 字段
                if (content.contains("\"message\"")) {
                    int messageIndex = content.indexOf("\"message\"");
                    if (messageIndex >= 0) {
                        int valueStart = content.indexOf(":", messageIndex) + 1;
                        while (valueStart < content.length() && Character.isWhitespace(content.charAt(valueStart))) {
                            valueStart++;
                        }

                        if (valueStart < content.length() && content.charAt(valueStart) == '"') {
                            valueStart++;
                            int valueEnd = content.indexOf("\"", valueStart);
                            if (valueEnd > valueStart) {
                                String message = content.substring(valueStart, valueEnd);
                                if (!message.isEmpty()) {
                                    log.info("提取到错误信息: {}", message);
                                    return message;
                                }
                            }
                        }
                    }
                }

                // 如果找不到 error 或 message，返回整个内容
                return content;
            } catch (Exception ex) {
                log.warn("解析 Feign 错误信息失败", ex);
            }
        }

        return e.getMessage();
    }
}

